/*
 * qxdatastruct.h
 *
 *  Created on: 2015年4月18日
 *      Author: FangFeng
 */

#ifndef QXDATASTRUCT_H_
#define QXDATASTRUCT_H_
#include <stdint.h>
#include <stdbool.h>
#include "microprocessor_definitions.h"
#define PI 3.141592653589793
/**************************************************
URGUI界面从服务程序接收过来的数据包，16类型的子包
Robot Message TYPE=ROBOT_STATE=16
Package-Type=0(Robot Mode Data)
向界面发送时是29个字节 ，但这个结构体实际上是32个字节
**************************************************/
typedef struct Robot_mode_data{
	int packageSize ;//长度
	uint8_t packageType;//包类型
	uint64_t timestamp;//时间戳
	bool isRobotConnected;//机器人连接状态 bool
	bool isRealRobotEnabled;// 真实机器人是否启用 bool
	bool isPowerOnRobot;//电源状态位  bool
	bool isEmergencyStopped;//紧急停止位  bool
	bool isSecurityStopped;//安全停止位   bool
	bool isProgramRunning;//程序运行状态位 bool
	bool isProgramPaused;//程序暂停标志位  bool
	uint8_t robotMode;    //机器人模式标志位
	double speedFraction; // 速度分数（滑块位置）
}ROBOT_MODE_DATA;


typedef struct joint_info{
	double q_actual;
	double q_target;
	double qd_actual;
	float I_actual;
	float V_actual;
	float T_motor;
	float T_micro;
	uint8_t jointMode;
}JOINT_INFO;

/**************************************************
URGUI界面从服务程序接收过来的数据包，16类型的子包
Robot Message TYPE=ROBOT_STATE=16
Package-Type=1(Joint data)
Joint data
向界面发送时共251个字节，这个结构体实际是272个字节
**************************************************/
typedef struct joint_data{
	int packageSize;
	uint8_t packageType;
	JOINT_INFO six_joint_info[NUMBER_OF_JOINTS];
}JOINT_DATA;


/**************************************************
URGUI界面从服务程序接收过来的数据包，16类型的子包
Robot Message TYPE=ROBOT_STATE=16
Package-Type=2(Tool data)
Tool data
向界面发送时共37个字节，这个结构体实际是44个字节
**************************************************/
typedef struct tool_data{
	int packageSize;    //0
	uint8_t packageType;//4
	char analogInputRange2;//5
	char analogInputRange3;//6
	double analogInput2;//8
	double analogInput3;//0x10
	float toolVoltage48V;//0x18
	uint8_t toolOutputVoltage;//0x1C
	float toolCurrent;//0x20
	float toolTemperature;//0x24
	uint8_t toolMode;//0x28
}TOOL_DATA;

/**************************************************
URGUI界面从服务程序接收过来的数据包，16类型的子包
Robot Message TYPE=ROBOT_STATE=16
Package-Type=3(Masterboard data)
Masterboard data
**************************************************/
typedef struct Masterboard_data
{
	int packageSize;
	uint8_t packageType;
	short digitalInputBits;
	short digitalOutputBits;
	char analogInputRange0;
	char analogInputRange1;
	double analogInput0;
	double analogInput1;
	char analogOutputDomain0;
	char analogOutputDomain1;
	double analogOutput0;
	double analogOutput1;
	float masterBoardTemperature;
	float robotVoltage48V;
	float robotCurrent;
	float masterIOCurrent;
	uint8_t masterSaftyState;
	uint8_t masterOnOffState;

	char euromap67InterfaceInstalled;  //如果这个值为1下面的才定义
#ifdef euromap67
	int euromapInputBits;
	int euromapOutputBits;
	short euromapVoltage;
	short euromapCurrent;
#endif
}MASTERBORD_DATA;

/**************************************************
URGUI界面从服务程序接收过来的数据包，16类型的子包
Robot Message TYPE=ROBOT_STATE=16
Package-Type=4(Cartesian info)
Cartesian info
向界面发送时共53个字节，这个结构体实际是56个字节
**************************************************/
typedef struct Cartesian_info{
	int packageSize;
	uint8_t packageType;
	double X;
	double Y;
	double Z;
	double Rx;
	double Ry;
	double Rz;
}CARTESIAN_INFO;

/**************************************************
URGUI界面从服务程序接收过来的数据包，16类型的子包
Robot Message TYPE=ROBOT_STATE=16
Package-Type=5(Kinematics info)
向界面发送时共225个字节，这个结构体实际是228个字节
**************************************************/
typedef struct Kinematics_info{  //正向运动学
	int packageSize;
	uint8_t packageType;
	int jointChecksum[NUMBER_OF_JOINTS];
	double deltaTheta[NUMBER_OF_JOINTS];   //θ
	double a[NUMBER_OF_JOINTS];			//a
	double d[NUMBER_OF_JOINTS];			//d
	double alpha[NUMBER_OF_JOINTS];        //α
	int calibrationStatus;
}KINEMATICS_INFO;


/**************************************************
URGUI界面从服务程序接收过来的数据包，16类型的子包
Robot Message TYPE=ROBOT_STATE=16
Package-Type=6(Configuration data)
Configuration data
向界面发送时共469个字节，这个结构体实际是472个字节
**************************************************/
typedef struct joint_limit{
	double jointMinLimit;
    double jointMaxLimit;
}JOINT_LIMIT;

typedef struct joint_max{
	double jointMaxSpeed;
    double jointMaxAcceleration;
}JOINT_MAX;

typedef struct Configuration_data{
	int packageSize;
	uint8_t packageType;
	JOINT_LIMIT six_joint_limit[NUMBER_OF_JOINTS];
	JOINT_MAX six_joint_max[NUMBER_OF_JOINTS];
	double vJointDefault;
	double aJointDefault;
	double vToolDefault;
	double aToolDefault;
	double eqRadius;
	double DHa[NUMBER_OF_JOINTS];			//a：两个关节之间连杆的长度
	double DHd[NUMBER_OF_JOINTS];   		//d：两条相垂直的公垂线之间的距离
	double DHalpha[NUMBER_OF_JOINTS]; 		// α关节扭转角度
	double DHtheta[NUMBER_OF_JOINTS];		// θ 绕z轴的旋转角
	int masterboardVersion;
	int controllerBoxType;
	int robotType;
	int robotSubType;
	int  motorType[NUMBER_OF_JOINTS];

}CONFIGURATION_DATA;



/**************************************************
URGUI界面从服务程序接收过来的数据包，16类型的子包
Robot Message TYPE=ROBOT_STATE=16
Package-Type=7(Configuration data)
向界面发送时共61个字节，这个结构体实际是54个字节
**************************************************/
typedef struct Force_mode_data{
	int packageSize;
	uint8_t packageType;
	double X;
	double Y;
	double Z;
	double Rx;
	double Ry;
	double Rz;
	double robotDexterity;
}FORCE_MODE_DATA;


/**************************************************
URGUI界面从服务程序接收过来的数据包，16类型的子包
Robot Message TYPE=ROBOT_STATE=16
Package-Type=8(Additional data)
向界面发送时共7个字节，这个结构体实际是8个字节
**************************************************/
typedef struct Additional_info{
	int packageSize;
	uint8_t packageType;
	bool teachButtonPressed;
	bool teachButtonEnabled;
}ADDITIONAL_INFO;



/**************************************************
URGUI界面从服务程序接收过来的数据包，16类型的子包
Robot Message TYPE=ROBOT_STATE=16
Package-Type=9(Calibration data)
Calibration data

**************************************************/
typedef struct Calibration_data
{
	int packageSize;
	uint8_t packageType;
}Calibration_data;

/**************************************************
???
**************************************************/
/*
Source is:

  6: Tool
  5: Wrist 3
  4: Wrist 2
  3: Wrist 1
  2: Elbow
  1: Shoulder
  0: Base
 -1: Safetysys
 -2: Controller
 -3: RTMachine
 -4: Simulated Robot
 -5: GUI
 -6: ControlBox

*/
/************************************************
URGUI界面程序接收的数据类型。
************************************************/
/*
The Robot Message types are:

 16: ROBOT_STATE
 20: ROBOT_MESSAGE
 22: HMC_MESSAGE
  5: MODBUS_INFO_MESSAGE
*/

typedef struct jointstate
{
	int     unknwon0;
	int     errorCode;//4 错误代码
	int     errorArgument;//8 errorArgument
	uint8_t unknownC[NUMBER_OF_JOINTS];//
	uint8_t joint_mode[NUMBER_OF_JOINTS];//0x12  18    已推测  robotinterface.c  robotinterface_get_joint_mode
	uint8_t unknown18;    //工具板用
	uint8_t unknown19;    //未知
	short motor_temperature[NUMBER_OF_JOINTS];//0x1a  26    已推测  robotinterface.c  robotinterface_get_motor_temperature  类型有待重新定义
	short micro_temperature[NUMBER_OF_JOINTS]; //0x26  38    已推测  robotinterface.c  robotinterface_get_micro_temperature
	short tool_temperature; //0x32  50    已推测  robotinterface.c  robotinterface_get_tool_temperature
	short joint_voltage[NUMBER_OF_JOINTS]; //0x34  52    已推测  robotinterface.c  robotinterface_get_joint_voltage
	short tool_voltage_48V;	//0x40  64    已推测  robotinterface.c  robotinterface_get_tool_voltage_48V
	short master_temperature;//0x42  66    已推测  robotinterface.c  robotinterface_get_master_temperature
	short robot_voltage_48V;//0x44  68    已推测  robotinterface.c  robotinterface_get_robot_voltage_48V
	short master_io_current;//0x46  70    已推测  robotinterface.c  robotinterface_get_master_io_current
	float robot_current;//0x48  72    已推测  robotinterface.c  robotinterface_get_robot_current
	uint8_t unknown4a[4];//0x4C 76
	uint8_t tool_mode;//0x50  80    已推测  robotinterface.c  robotinterface_get_tool_mode
	uint8_t toolErrorState;		//0x51  81    已推测  工具板错误状态
	uint8_t tool_error_argument;	//0x52  82    已推测  工具板错误参数 Tool_error_argument
	uint8_t error[NUMBER_OF_JOINTS];   		//0x53  83	  已推测
	uint8_t jointerrorArgument[NUMBER_OF_JOINTS];//int unknown5c;//0x5C  92
	double actual_joint_position[NUMBER_OF_JOINTS]; //0x60  96    已推测  命名可以参考robotinterface_get_actual_position 位置
	double actual_joint_velocity[NUMBER_OF_JOINTS]; //0x90 144    已推测  命名可以参考robotinterface_get_actual_velocity 速度
	double actual_joint_current[NUMBER_OF_JOINTS];	//0XC0 192    已推测 lza    robotinterface.c  robotinterface_get_actual_current 电流
	double target_position[NUMBER_OF_JOINTS];//0xf0 240    已推测 lza 未命名   robotinterface.c  robotinterface_unlock_security_stop  q
	double target_velocity[NUMBER_OF_JOINTS];//0x120 288   已推测 lza 未命名   robotinterface.c  robotinterface_unlock_security_stop  qd
	double target_acceleration[NUMBER_OF_JOINTS];//0x150  336  已推测 lza 未命名   robotinterface.crobotinterface_get_target				 qdd
	double target_current[NUMBER_OF_JOINTS];//0x180  384  已推测 lza 未命名   robotinterface.c  robotinterface_unlock_security_stop
	double target_safety_current1B0[NUMBER_OF_JOINTS];    	//0x1b0   432
	double security_torque[NUMBER_OF_JOINTS];// target_moment[NUMBER_OF_JOINTS];	扭矩 //0x1e0  480  已推测 lza 		  robotinterface.c  robotinterface_get_target_moment
	double gear_shear[NUMBER_OF_JOINTS][3];  //0x210   urEthernetComm   parseGearShearValues
	//double actual_analog_input;				//0x29c  668  已推测 lza 未命名   robotinterface.c  robotinterface_get_actual_analog_input
	uint8_t actual_analog_input_range;    //0x2A0
	uint8_t actual_analog_output_domain; //0x2A1
	uint16_t DI;     						//0x2A2  674  已推测    actual_digital_input_bits
	uint16_t DO;     						//0x2A4  676  已推测    actual_digital_output_bits
	uint8_t actual_digital_input;	//0x2A6  678  已推测 lza   robotinterface.c  robotinterface_get_actual_digital_input
	uint8_t actual_digital_output;	//0x2A7  679  已推测 lza   robotinterface.c  robotinterface_get_actual_digital_output
	uint16_t tool_current;//float tool_current;	//0x2A8  680  已推测 lza   robotinterface.c  robotinterface_get_tool_current
	double actual_analog_input2[2];    //0x2AC 工具板用   digital_output
	double tool_ax;//0x2bc  700  已推测 lza   robotinterface.c  robotinterface_get_tool_accelerometer_readings
	double tool_ay;//0x2c4  708  已推测 lza   robotinterface.c  robotinterface_get_tool_accelerometer_readings
	double tool_az;//0x2cc  716  已推测 lza   robotinterface.c  robotinterface_get_tool_accelerometer_readings
	//double An1;     						//0x2D4  724  已推测
	//double An2;     						//0x2DC  732  已推测
	double actual_analog_input1[2];    //0x2D4  724
} jointstate;
/*************************************************************************
 * unknown2A7 & 20 10  8 4
 *
 * **********************************************************************/
typedef struct robotstate
{
	jointstate joint_state;     //0x0    0 -739
	double analog_output[2];//0x2e4  740 已推测 lza   robotinterface.c  robotinterface_get_actual_analog_output
	double power;//0x2f4  756 已推测 lza   robotinterface.c  robotinterface_get_power
	double tcp_speed[NUMBER_OF_JOINTS]; //0x2fc  764 已推测 lza   robotinterface.c  robotinterface_get_tcp_speed
	double tcp_force[NUMBER_OF_JOINTS]; //0x32c  812 已推测 lza   robotinterface.c  robotinterface_get_tcp_force
	double tcp_force_scalar; //0x35c  860 已推测 lza   robotinterface.c  robotinterface_get_tcp_force_scalar
	double tcp_power;//0x364  868 已推测 lza   robotinterface.c  robotinterface_get_tcp_force_scalar
	//0x200000 第21位为1表示急停
   //0x1000  第12位为表示外部急停是否按下     //0x8       第3位表示电源是否按下
   //0x10    第4位为1表示初始化模式
	uint32_t master_control_bits;//old name is_emergency_stopped_flag	//0x36c  876  lza         应命名：master_control_bits  robotinterface_get_master_control_bits
	uint8_t master_safety_state;//0x370  880 已推测 lza   robotinterface.c  robotinterface_get_master_safety_state
	uint8_t master_on_off_state;//0x371  881 已推测 lza   robotinterface.c  robotinterface_get_master_on_off_state
	uint8_t unknown882[7];      //0x372-0x378
	uint8_t euromap_hardware_installed;	//0x379  889 已推测 lza   robotinterface.c  robotinterface_is_euromap_hardware_installed
	//uint8_t unknown890;          //0x37A   可能是字节对齐
	uint32_t euromap_input_bits; //0x37c  892 已推测 lza   robotinterface.c  robotinterface_get_euromap_input_bits
	uint32_t euromap_output_bits; //0x380  896 已推测 lza   robotinterface.c  robotinterface_get_euromap_output_bits
	uint16_t euromap_24V_voltage;//0x384  900 已推测 lza   robotinterface.c  robotinterface_get_euromap_24V_voltage
	uint16_t euromap_24V_current;//0x386  902 已推测 lza   robotinterface.c  robotinterface_get_euromap_24V_current
} robostate;//904

typedef struct robotcommd
{
	  uint8_t jointcommand[NUMBER_OF_JOINTS];		//0-5  关节命令类型
	  double joint_position[NUMBER_OF_JOINTS];    //0x08  8      lza 未命名   关节位置
	  double joint_velocity[NUMBER_OF_JOINTS];   //0x38  56    已推测
	  double joint_acceleration[NUMBER_OF_JOINTS];   //0x68  104   已推测  加速度
	  double safety_current[NUMBER_OF_JOINTS];	//0x98  152   已推测    电流
	  float  softness[NUMBER_OF_JOINTS];  //0xC8   200-223
	  uint8_t analog_input_range_port;		//0xe0  224   已推测  lza 未命名  robotinterface_command_analog_input_range_port
	  uint8_t analog_output_domain;       //0xe1  225   已推测  lza 未命名  robotinterface_command_analog_output_domain
	  uint8_t toolcommand;                //robotcommand;	//0xE2 226  工具板命令类型
	  uint8_t unknown227;                 //0xE3  可能是数据对齐
	  uint16_t digital_out_port;          //0xe4  228   已推测  lza 曾用名unknown228   robotinterface.c  robotinterface_command_digital_out_port
	  uint8_t analogInputRange[2];	      //0xe6
	  uint8_t digital_out_bit;             //0xe8  232   已推测  lza 未命名   robotinterface.c  robotinterface_command_digital_out_port
	  double target_analog_output[2];		//0xec  236   已推测  lza 未命名   robotinterface.c  robotinterface_command_analog_out_port 八个字节一组，大小确定
	  uint16_t euromap_output;            //0xfc  252
	  //uint16_t unknown252;					//0xfc  252   已推测  lza 未命名   robotinterface.c  robotinterface_set_euromap_output //可能是大小
	  uint16_t unknown254;
 }robotcommd;

#endif /* QXDATASTRUCT_H_ */
